/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Practica2;

/**
 *
 * @author UNSAAC30X
 */
import java.util.ArrayList;
 
import java.util.List;
 

 

 
public class Tupla 
 
{
 

 
    /** Identificador de la tupla. */
 
    private IdentificadorTupla idTupla;
 
    /** Valores almacenados en la tupla. */
 
    private List<Comparable> valores;
 

 
    /**
 
     * Constructor de una nueva <code>Tupla</code> vácia.
 
     */
 
    public Tupla() 
 
    {
 
        this.idTupla = null;
 
        this.valores = new ArrayList<Comparable>();
 
    } // Tupla()
 

 
    /**
 
     * Constructor de una nueva tupla dado un identificador y  
 
     * <code>Lista</code> de valores.
 
     * 
 
     * @param idTupla, identificador de la tupla.
 
     * @param valores el valores a ser añadidos.
 
     */
 
    public Tupla(IdentificadorTupla idTupla, List<Comparable> valores) 
 
    {
 
        this.idTupla = idTupla;
 
        this.valores = valores;
 
    } // Tupla()
 

 
    /**
 
     * Devolver el identificador de la tupla.
 
     * 
 
     * @return el identificador de la tupla.
 
     */
 
    public IdentificadorTupla getIdTupla() {
 
        return idTupla;
 
    } // getIdTupla()
 

 
    /**
 
     * Cambiar el valor de una celda de la tupla.
 
     * 
 
     * @param celda, la celda de la tupla a la que se accede.
 
     * @param valor, el nuevo valor en la celda de la tupla.
 
     */
 
    public void setValor(int celda, Comparable valor) {
 
        valores.set(celda, valor);
 
    } // setValor()
 

 
    /**
 
     * Cambia los valores de la tupla.
 
     * 
 
     * @param valores, una lista de los valores nuevos.
 
     */
 
    public void setValores(List<Comparable> values) {
 
        this.valores.clear();
 
        this.valores = values;
 
    } // setValores()
 

 
    /**
 
     * Devuelve la cantidad de celdas de la tupla.
 
     * 
 
     * @return numero de celdas en la tupla.
 
     */
 
    public int size() {
 
        return valores.size();
 
    } // size()
 

 
    /**
 
     * Devuelve los valores de la tupla.
 
     * 
 
     * @return valores de la tupla.
 
     */
 
    public List<Comparable> getValores() {
 
        return valores;
 
    } // getValores()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo character.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * character.
 
     * 
 
     */
 
    public char asChar(int celda) {
 
        Character c = (Character) valores.get(celda);
 
        return c.charValue();
 
    } // asChar()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo Byte.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * Byte.
 
     * 
 
     */
 
    public byte asByte(int celda) {
 
        Byte b = (Byte) valores.get(celda);
 
        return b.byteValue();
 
    } // asByte()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo Short.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * Short.
 
     * 
 
     */
 
    public short asShort(int celda) {
 
        Short s = (Short) valores.get(celda);
 
        return s.shortValue();
 
    } // asShort()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo int.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * int.
 
     * 
 
     */
 
    public int asInt(int celda) {
 
        Integer in = (Integer) valores.get(celda);
 
        return in.intValue();
 
    } // asInt()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo Long.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * long.
 
     * 
 
     */
 
    public long asLong(int celda){
 
        Long l = (Long) valores.get(celda);
 
        return l.longValue();
 
    } // asLong()
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo float.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * float.
 
     * 
 
     */
 
    public float asFloat(int celda){
 
        Float f = (Float) valores.get(celda);
 
        return f.floatValue();
 
    } // asFloat() 
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo double.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * double.
 
     * 
 
     */
 
    public double asDouble(int celda){
 
        Double doub = (Double) valores.get(celda);
 
        return doub.doubleValue();
 
    } // asDouble() 
 

 
    /**
 
     * Devolver la celda de una tupla como tipo primitivo String.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return un celda específica de la tupla como un tipo primitivo
 
     * String.
 
     * 
 
     */
 
    public String asString(int celda) {
 
        String str = (String) valores.get(celda);
 
        return str;
 
    } // asString()
 

 
    /**
 
     * Devolver la celda especificada de la tupla como generic
 
     * Comparable.
 
     * 
 
     * @param celda, la celda de la <code>Tupla</code> accedida.
 
     * @return la celda especifica de la tupla como generic Comparable.
 
     */
 
    public Comparable getValor(int celda) {
 
        return valores.get(celda);
 
    } // getValue()
 

 
    /**
 
     * probar la igualdad de objetos.
 
     *
 
     * @param o objeto a comparar con la tupla.
 
     * @return <code>true</code> si la tupla es igual a
 
     * <code>o</code>, <code>false</code> caso contrario.
 
     */
 
    @Override
 
    public boolean equals(Object o) {
 

 
        if (o == this) {
 
            return true;
 
        }
 
        if (!(o instanceof Tupla)) {
 
            return false;
 
        }
 
        Tupla t = (Tupla) o;
 
        if (size() != t.size()) {
 
            return false;
 
        }
 
        if (!getIdTupla().equals(t.getIdTupla())) {
 
            return false;
 
        }
 
        int i = 0;
 
        for (Comparable comp : valores) {
 
            if (!comp.equals(t.getValor(i))) {
 
                return false;
 
            }
 
            i++;
 
        }
 
        return true;
 
    }
 

 
    /**
 
     * Devolver el hash code de la tupla.
 
     *
 
     * @return un hash code de la tupla.
 
     */
 
    @Override
 
    public int hashCode() {
 
        int hash = 17;
 
        hash += 31 * hash + getIdTupla().hashCode();
 
        for (Comparable comp : valores) {
 
            hash += 31 * hash + comp.hashCode();
 
        }
 
        return hash;
 
    }
 

 
    /**
 
     * Representación Textual.
 
     */
 
    @Override
 
    public String toString() {
 
        return idTupla.toString() + " : " + valores.toString();
 
    } // toString()
 
}
 

